﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace SVC_DAL
{
    public class ProdutosDAL
    {
        public ProdutosDAL()
        { }

        Dados objD = null;

        //inserção
        public int inserir(String pro_nome, int pro_quantidade, Double pro_precoCusto, Double pro_precoVenda, int pro_categoria, 
            int pro_grupo, int pro_subgrupo, int pro_unidade, int pro_estoqueMin, int pro_estoqueMax, DateTime pro_dataCadastro,
            String pro_codigoBarra, int pro_marca, int pro_fornecedor, int pro_tamanho, Double pro_margem, Double pro_comissao)
        {
            SqlCommand cmd = null;
            try
            {
                int codigo;
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "INSERT INTO Produtos" +
                    "(pro_nome,pro_quantidade, pro_precoCusto, pro_precoVenda, pro_categoria, pro_grupo, pro_subGrupo, pro_unidade, pro_estoqueMin,pro_estoqueMax,pro_dataCadastro,pro_codigoBarra,pro_marca,pro_fornecedor, pro_tamanho, pro_margem, pro_comissao)" +
                    " VALUES (@pro_nome,@pro_quantidade, @pro_precoCusto, @pro_precoVenda, @pro_categoria, @pro_grupo, @pro_subGrupo, @pro_unidade,@pro_estoqueMin,@pro_estoqueMax,@pro_dataCadastro,@pro_codigoBarra,@pro_marca,@pro_fornecedor,@pro_tamanho,@pro_margem,@pro_comissao)";
                cmd.Parameters.Add(new SqlParameter("@pro_nome", SqlDbType.VarChar)).Value = pro_nome;
                cmd.Parameters.Add(new SqlParameter("@pro_quantidade", SqlDbType.Int)).Value = pro_quantidade;
                cmd.Parameters.Add(new SqlParameter("@pro_precoCusto", SqlDbType.Decimal)).Value = pro_precoCusto;
                cmd.Parameters.Add(new SqlParameter("@pro_precoVenda", SqlDbType.Decimal)).Value = pro_precoVenda;
                cmd.Parameters.Add(new SqlParameter("@pro_categoria", SqlDbType.Int)).Value = pro_categoria;
                if (pro_grupo == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_grupo", SqlDbType.Int)).Value = DBNull.Value; //Se não tiver grupo
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_grupo", SqlDbType.Int)).Value = pro_grupo;
                if (pro_subgrupo == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_subgrupo", SqlDbType.Int)).Value = DBNull.Value; //Se não tiver SubGrupo
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_subgrupo", SqlDbType.Int)).Value = pro_subgrupo;
                if(pro_unidade == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_unidade", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_unidade", SqlDbType.Int)).Value = pro_unidade;
                cmd.Parameters.Add(new SqlParameter("@pro_estoqueMin", SqlDbType.Int)).Value = pro_estoqueMin;
                cmd.Parameters.Add(new SqlParameter("@pro_estoqueMax", SqlDbType.Int)).Value = pro_estoqueMax;
                cmd.Parameters.Add(new SqlParameter("@pro_dataCadastro", SqlDbType.DateTime)).Value = pro_dataCadastro;
                if (pro_codigoBarra == "" || pro_codigoBarra == null)
                    cmd.Parameters.Add(new SqlParameter("@pro_codigoBarra", SqlDbType.VarChar)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_codigoBarra", SqlDbType.VarChar)).Value = pro_codigoBarra;
                cmd.Parameters.Add(new SqlParameter("@pro_marca", SqlDbType.Int)).Value = pro_marca;
                if (pro_fornecedor == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_fornecedor", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_fornecedor", SqlDbType.Int)).Value = pro_fornecedor;
                if (pro_tamanho == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_tamanho", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_tamanho", SqlDbType.Int)).Value = pro_tamanho;
                if (pro_margem == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_margem", SqlDbType.Float)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_margem", SqlDbType.Float)).Value = pro_margem;
                if (pro_comissao == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_comissao", SqlDbType.Float)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_comissao", SqlDbType.Float)).Value = pro_comissao;
                codigo = objD.executacomandoInsert(cmd,"Produtos");
                cmd = null;
                objD = null;
                return codigo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //alterar
        public void alterar(int pro_codigo, String pro_nome, int pro_quantidade, Double pro_precoCusto, Double pro_precoVenda, 
            int pro_categoria, int pro_grupo, int pro_subgrupo, int pro_unidade, int pro_estoqueMin, int pro_estoqueMax,
            DateTime pro_dataCadastro, String pro_codigoBarra, int pro_marca, int pro_fornecedor, int pro_tamanho, 
            Double pro_margem, Double pro_comissao)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "UPDATE Produtos" +
                    " SET pro_nome=@pro_nome, pro_quantidade=@pro_quantidade, pro_precoCusto=@pro_precoCusto,"+
                    " pro_precoVenda=@pro_precoVenda,"+
                    " pro_categoria=@pro_categoria, pro_grupo=@pro_grupo, pro_subGrupo=@pro_subGrupo,"+
                    " pro_unidade=@pro_unidade, pro_estoqueMin = @pro_estoqueMin, pro_estoqueMax = @pro_estoqueMax,"+
                    " pro_dataCadastro=@pro_dataCadastro, pro_codigoBarra=@pro_codigoBarra, pro_marca=@pro_marca, pro_fornecedor=@pro_fornecedor, pro_tamanho = @pro_tamanho, pro_margem=@pro_margem, pro_comissao=@pro_comissao" +
                    " WHERE" +
                    " pro_codigo=@pro_codigo";
                cmd.Parameters.Add(new SqlParameter("@pro_codigo", SqlDbType.Int)).Value = pro_codigo;
                cmd.Parameters.Add(new SqlParameter("@pro_nome", SqlDbType.VarChar)).Value = pro_nome;
                cmd.Parameters.Add(new SqlParameter("@pro_quantidade", SqlDbType.Int)).Value = pro_quantidade;
                cmd.Parameters.Add(new SqlParameter("@pro_precoCusto", SqlDbType.Decimal)).Value = pro_precoCusto;
                cmd.Parameters.Add(new SqlParameter("@pro_precoVenda", SqlDbType.Decimal)).Value = pro_precoVenda;
                
                cmd.Parameters.Add(new SqlParameter("@pro_categoria", SqlDbType.Int)).Value = pro_categoria;
                if (pro_grupo == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_grupo", SqlDbType.Int)).Value = DBNull.Value; //Se não tiver grupo
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_grupo", SqlDbType.Int)).Value = pro_grupo;
                if (pro_subgrupo == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_subgrupo", SqlDbType.Int)).Value = DBNull.Value; //Se não tiver SubGrupo
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_subgrupo", SqlDbType.Int)).Value = pro_subgrupo;
                if (pro_unidade == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_unidade", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_unidade", SqlDbType.Int)).Value = pro_unidade;
                cmd.Parameters.Add(new SqlParameter("@pro_estoqueMin", SqlDbType.Int)).Value = pro_estoqueMin;
                cmd.Parameters.Add(new SqlParameter("@pro_estoqueMax", SqlDbType.Int)).Value = pro_estoqueMax;
                cmd.Parameters.Add(new SqlParameter("@pro_dataCadastro", SqlDbType.DateTime)).Value = pro_dataCadastro;
                if (pro_codigoBarra == "" || pro_codigoBarra == null)
                    cmd.Parameters.Add(new SqlParameter("@pro_codigoBarra", SqlDbType.VarChar)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_codigoBarra", SqlDbType.VarChar)).Value = pro_codigoBarra;
                cmd.Parameters.Add(new SqlParameter("@pro_marca", SqlDbType.Int)).Value = pro_marca;
                if (pro_fornecedor == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_fornecedor", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_fornecedor", SqlDbType.Int)).Value = pro_fornecedor;
                if(pro_tamanho == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_tamanho", SqlDbType.Int)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_tamanho", SqlDbType.Int)).Value = pro_tamanho;
                if (pro_margem == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_margem", SqlDbType.Float)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_margem", SqlDbType.Float)).Value = pro_margem;
                if (pro_comissao == 0)
                    cmd.Parameters.Add(new SqlParameter("@pro_comissao", SqlDbType.Float)).Value = DBNull.Value;
                else
                    cmd.Parameters.Add(new SqlParameter("@pro_comissao", SqlDbType.Float)).Value = pro_comissao;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            cmd = null;
            objD = null;
        }

        public void alterarQuantidade(int pro_codigo, int pro_quantidade)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "UPDATE Produtos" +
                    " SET pro_quantidade=@pro_quantidade"+
                    " WHERE" +
                    " pro_codigo=@pro_codigo";
                cmd.Parameters.Add(new SqlParameter("@pro_codigo", SqlDbType.Int)).Value = pro_codigo;
                cmd.Parameters.Add(new SqlParameter("@pro_quantidade", SqlDbType.Int)).Value = pro_quantidade;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            cmd = null;
            objD = null;
        }

        public void excluir(int pro_codigo)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "DELETE FROM Produtos" +
                    " WHERE" +
                    " pro_codigo=@pro_codigo";
                cmd.Parameters.Add(new SqlParameter("@pro_codigo", SqlDbType.Int)).Value = pro_codigo;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
        }

        //selecionar várias linhas
        public DataTable localizar(String descricao, String coluna)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Produtos" +
                    " WHERE " + coluna + " like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = descricao + "%";
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable localizarLeave(String descricao, String coluna)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Produtos" +
                    " WHERE " + coluna + " like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = descricao;
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        //selecionar uma linha - um código
        public int localizar(int codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Produtos" +
                    " WHERE pro_codigo = @codigo";
                cmd.Parameters.Add(new SqlParameter("@codigo",
                    SqlDbType.Int)).Value = codigo;
                tab = objD.executaconsulta(cmd);
                cmd = null;
                objD = null;
                if (tab.Rows.Count > 0)
                    return int.Parse(tab.Rows[0][0].ToString());
                else
                    return 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable localizarEmTudo(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT TOP 100 p.pro_codigo 'Código do Produtos',p.pro_nome 'Produto',p.pro_precoCusto 'Preço de Custo',p.pro_precoVenda 'Preço de Venda'," +
                                   " p.pro_codigoBarra 'Código de Barras',p.pro_dataCadastro 'Data de Cadastro', p.pro_quantidade 'Quantidade'," +
                                   " p.pro_estoqueMin 'Estoque Mínimo',p.pro_estoqueMax 'Estoque Máximo',p.pro_tamanho 'Tamanho',p.pro_margem 'Margem', p.pro_comissao 'Comissão'," +
                                   " m.mar_descricao 'Marca',u.uni_descricao 'Unidade', g.gru_descricao 'Grúpo', sg.sg_descricao 'Subgrupo', c.cat_descricao 'Categoria'" +
                            " FROM Grupo g Right JOIN Produtos p on g.gru_codigo = p.pro_grupo " +
                                    " LEFT JOIN SubGrupo sg on p.pro_subGrupo = sg.sg_codigo " +
                                    " LEFT JOIN Marcas m on p.pro_marca = m.mar_codigo " +
                                    " LEFT JOIN Empresa e on p.pro_marca = e.emp_codigo" +
                                    " LEFT JOIN Categoria c on p.pro_categoria = c.cat_codigo " +
                                    " LEFT JOIN Unidades u on p.pro_unidade = u.uni_codigo " +
                            " WHERE p.pro_codigo like @descricao or p.pro_nome like @descricao " +
                                    " or p.pro_codigoBarra like @descricao"+
                                    " or p.pro_quantidade like @descricao or p.pro_precoCusto like @descricao " +
                                    " or p.pro_precoVenda like @descricao or g.gru_descricao like @descricao or sg.sg_descricao like @descricao " +
                                    " or p.pro_estoqueMin like @descricao or p.pro_estoqueMax like @descricao or p.pro_dataCadastro like @descricao " +
                                    " or p.pro_margem like @descricao or p.pro_tamanho like @descricao" +
                                    " or m.mar_descricao like @descricao or c.cat_descricao like @descricao or u.uni_descricao like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = "%" + descricao + "%";

                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable localizarProdutoCodigoBarra(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM Produtos" +
                    " WHERE pro_nome like @descricao  or  pro_codigoBarra like @descricao and pro_quantidade >0 ";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = "%" + descricao + "%";
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }


        public DataTable localizarPrimeiroUltimo(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                if (descricao == "ultimo")
                {
                    cmd.CommandText = "SELECT pro_codigo = max(pro_codigo) FROM Produtos";
                    cmd.Parameters.Add(new SqlParameter("@descricao",
                         SqlDbType.VarChar)).Value = descricao;
                }
                else if (descricao == "primeiro")
                {
                    cmd.CommandText = "SELECT pro_codigo = min(pro_codigo) FROM Produtos";
                    cmd.Parameters.Add(new SqlParameter("@descricao",
                     SqlDbType.VarChar)).Value = descricao;
                }
                tab = objD.executaconsulta(cmd);

            }
            catch (Exception)
            {

                throw;
            }
            return tab;
        }

        public DataTable localizarProxAnterior(String descricao, int codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                if (descricao == "proximo")
                    cmd.CommandText = "SELECT pro_codigo FROM Produtos WHERE pro_codigo = (SELECT MIN(pro_codigo) FROM Produtos WHERE pro_codigo > @codigo)";

                else if (descricao == "anterior")
                    cmd.CommandText = "SELECT pro_codigo FROM Produtos WHERE pro_codigo = (SELECT MAX(pro_codigo) FROM Produtos WHERE pro_codigo < @codigo)"; ;

                cmd.Parameters.Add(new SqlParameter("@codigo", SqlDbType.Int)).Value = codigo;

                tab = objD.executaconsulta(cmd);
            }
            catch (Exception)
            {

                throw;
            }
            return tab;
        }
    }
}
